﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DAL;
using DAL.Models;
using BAL;
using BibliotecaVirtual.Models;
using System.Web.Security;
using BAL.Interfaces;

namespace BibliotecaVirtual.Controllers
{ 
    public class ReservacionesController : Controller
    {
        private IReservacionesService BALReservaciones = null;
        private ISociosService BALSocio = null;
        private IEstadoReservasService BALEstadoReservas = null;
        private IMaterialsService BALMaterial = null;
        private IUsuarioSocioService BALUsuarioSocio = null;

        public ReservacionesController(IReservacionesService ReservacionesService,
                                   ISociosService SociosService,
                                   IEstadoReservasService EstadoReservasService,
                                   IMaterialsService MaterialsService,
                                   IUsuarioSocioService UsuarioSocioService)
        {
            BALReservaciones = ReservacionesService;
            BALSocio = SociosService;
            BALEstadoReservas = EstadoReservasService;
            BALMaterial = MaterialsService;
            BALUsuarioSocio = UsuarioSocioService;
        }

        [Authorize(Roles = Libreria.Constantes.SOCIO)]
         public ViewResult Index()
        {
            Socios s = BALUsuarioSocio.GetSocioByGuid((Guid)Membership.GetUser().ProviderUserKey);
            var reservaciones = BALReservaciones.GetBySocioID(s.id);

            if (System.Web.Security.Roles.GetRolesForUser().Contains(Libreria.Constantes.ADMINISTRADOR))
                {
                    reservaciones = BALReservaciones.GetAllValidados();
                }
                return View(reservaciones.ToList());
         

        }


        public ViewResult MaximoReservasAlcanzadas()
        {
            return View();
        }

        //
        // GET: /Reservaciones/Create
        [Authorize(Roles = Libreria.Constantes.SOCIO)]
        public ActionResult Create()
        {
            cargarDatos(null);
            return View();
        }

        [HttpPost]
        [Authorize(Roles = Libreria.Constantes.SOCIO)]
        public ActionResult CreateConDatos(Reservaciones reservaciones)
        {
            return Create(reservaciones);
        } 

        //
        // POST: /Reservaciones/Create

        [HttpPost]
        [Authorize(Roles = Libreria.Constantes.SOCIO)]
        public ActionResult Create(Reservaciones reservaciones)
        {
            Socios s = BALUsuarioSocio.GetSocioByGuid((Guid)Membership.GetUser().ProviderUserKey);

            reservaciones.SocioId = s.id;

            if (BALReservaciones.PuedoReservar(reservaciones))
            {
                return RedirectToAction("MaximoReservasAlcanzadas");
            }

            BALReservaciones.ModificarEstadoReserva(ref reservaciones);
            
            if (ModelState.IsValid)
            {
                reservaciones.FechaEfectivo = System.DateTime.Now;
                BALReservaciones.Create(reservaciones);
                return RedirectToAction("Index");  
            }
            cargarDatos(reservaciones);
            return View(reservaciones);
        }
        
        //
        // GET: /Reservaciones/Edit/5
        [Authorize(Roles = Libreria.Constantes.ADMINISTRADOR)]
        public ActionResult Edit(long id)
        {
            object[] keys = new object[1] { id };
            Reservaciones item = BALReservaciones.Find(keys);
            cargarDatos(item);
            return View(item);
        }

        //
        // POST: /Reservaciones/Edit/5

        [HttpPost]
        [Authorize(Roles = Libreria.Constantes.ADMINISTRADOR)]
        public ActionResult Edit(Reservaciones reservaciones)
        {
            if (ModelState.IsValid)
            {
                BALReservaciones.Edit(reservaciones);
                return RedirectToAction("Index");
            }
            cargarDatos(reservaciones);

            if (ModelState.IsValid)
            {
                reservaciones.FechaEfectivo = System.DateTime.Now;
                BALReservaciones.Edit(reservaciones);
                return RedirectToAction("Index");
            }
            return View(reservaciones);
        }

        public ViewResult DespachoConExito()
        {
            return View();
        }



        [Authorize(Roles = Libreria.Constantes.SOCIO)]
        public ActionResult Cancelar(long id)
        {
            Reservaciones reservacion = BALReservaciones.GetValidadoById(id);
            Cancelar(reservacion);
            return View();
        }

        [HttpPost]
        [Authorize(Roles = Libreria.Constantes.SOCIO)]
        public ActionResult Cancelar(Reservaciones reservacion)
        {
            reservacion = BALReservaciones.GetValidadoById(reservacion.id);
            return Edit(BALReservaciones.Cancelar(reservacion));
        }

        //
        // GET: /Despacho
        [Authorize(Roles = Libreria.Constantes.ADMINISTRADOR)]
        public ActionResult Issue(long id)
        {
            return View("Issue", BALReservaciones.GetValidadoById(id));
        }

        //
        // POST: /Despacho

        [HttpPost]
        [Authorize(Roles = Libreria.Constantes.ADMINISTRADOR)]
        public ActionResult Issue(Reservaciones reservacion)
        {
            reservacion = BALReservaciones.GetValidadoById(reservacion.id);
            IEnumerable<Ejemplars> disponibles = BALReservaciones.GetEjemplaresDisponibles(reservacion);

            if (disponibles.Count() > 0)
                {
                    if ((BALReservaciones.GetReservasDisponibles(reservacion).Count<Reservaciones>() == 0) && (reservacion.Socios.Prestamos.Count() <= 2))
                {
                    if (ModelState.IsValid)
                    {
                        BALReservaciones.GuardarDespacho(reservacion, disponibles);
                        return RedirectToAction("DespachoConExito");
                    }
                }
            }
               


            return RedirectToAction("index");
        }

        //protected override void Dispose(bool disposing)
        //{
        //    BALReservacion.Dispose();
        //    base.Dispose(disposing);
        //}

        protected void cargarDatos(Reservaciones reservaciones)
        {
            if (reservaciones != null)
            {
                ViewBag.SocioId = new SelectList(BALSocio.GetAll(), "id", "Nombre", reservaciones.SocioId);
                ViewBag.MaterialId = new SelectList(BALMaterial.GetAll(), "id", "Titulo", reservaciones.MaterialId);
                ViewBag.EstadoReservaId = new SelectList(BALEstadoReservas.GetAll(), "id", "Descripcion", reservaciones.EstadoReservaId);
    }
            else
            {
                ViewBag.MaterialId = new SelectList(BALMaterial.GetAll(), "id", "Titulo");
                ViewBag.EstadoReservaId = new SelectList(BALEstadoReservas.GetAll(), "id", "Descripcion");
                ViewBag.SocioNombreCompleto = Membership.GetUser().UserName;
            }

        }
    }
}